package service.Impl;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import handler.FinanceChainHandler;
import handler.Main;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import service.IBinaryService;
import sun.misc.BASE64Encoder;

import javax.xml.crypto.Data;
import java.io.*;
import java.util.Date;

/**
 * @Author huangrui
 * @Date 2019/12/27 20:29
 * @Version 1.0
 */

public class BinaryServiceImp implements IBinaryService {

    private static Logger logger = LoggerFactory.getLogger(BinaryServiceImp.class);

    /**
     * 二进制文件上链
     * 描述：二进制文件上链，给文件路径，自动生成哈希上链
     * @param path 本地文件路径
     * @return
     */
    @Override
    public  String saveToBc(String orgid, String path)  {


            //读取文件
        FileInputStream fileInputStream= null;
        try {
            fileInputStream = new FileInputStream(path);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        String result = null;
            byte[] data = null;
        try {
            data = new byte[fileInputStream.available()];
            fileInputStream.read(data);
        } catch (IOException e) {
            e.printStackTrace();
        }

            //使用BASE64Encoder编码
            BASE64Encoder encoder = new BASE64Encoder();
            result =  encoder.encode(data);
            //调用SHA526Util生成SHA
            String hashcode =  DigestUtils.sha256Hex(result);

            //创建一个JsonObject类用于接收hash或者编码的返回值
            JSONObject jsonObject=new JSONObject();
        Date date = new Date();
        // 将生成的hash放到jsonObject
            jsonObject.put("hashcode",hashcode);
            return FinanceChainHandler.getInstance().saveFileRecord(orgid,path,hashcode);

    }


    /**
     * 二进制文件校验
     * 描述：二进制文件校验，给文件路径，到链上数据获取，并将文件的哈希生成好进行比较
     * 传一个hash过来，分两步比较
      * 1.本地文件生成hash比较
      * 2.与链上的hash比较
     * @param localfliepath 本地文件路径
     *  @param hash 本地文件生成的hash
     * @param checkhash 拿来校验的hash
     * @param   path  链上全路径，根据路径获取hash
     * @return
     */
    @Override
    public  boolean  vaildateHash(String orgid, String localfliepath, String checkhash, String path)throws Exception {

        //读取本地文件
        FileInputStream fileInputStream = new FileInputStream(localfliepath);
        String result = null;
        byte[] localdata = new byte[fileInputStream.available()];
        fileInputStream.read(localdata);

        //使用BASE64Encoder编码
        BASE64Encoder encoder = new BASE64Encoder();
        result = encoder.encode(localdata);
        //调用DigestUtils生本地文件成hash
        String hash = DigestUtils.sha256Hex(result);

        //jsonfile表示链上文件

        JSONObject jsonfile = JSONObject.parseObject(FinanceChainHandler.getInstance().getFileRecord(orgid, path));

        String chainhash = jsonfile.getJSONObject("data").getString("hashcode");

        //校验
        //第一步.与本地生成的hash比较
        if (checkhash.equals(hash)) {
            //通过后执行第二步，与链上的hash比较
          //获取链上的hash

            if (checkhash.equals(chainhash)) {
                return true;
            }
        }
        return false;
    }

}
